Модуль:Script doc auto

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Модуль на основе Module:Script doc auto в английской Википедии. Используется для создания части сообщения MediaWiki:Clearyourcache. Используется там без параметров ({{#invoke:Script doc auto|main}}). Для тестирования поддерживает параметр page.

Примеры

Выводит в пространствах «Участник/Участница» и «Медиавики» сообщения в зависимости от их цели.

Гаджеты

Общие скрипты

  • {{#invoke:Script doc auto|main|page=MediaWiki:Common.js}} → JS-код ниже относится ко всем темам оформления стационарной версии Википедии. CSS-файл: MediaWiki:Common.css.
  • {{#invoke:Script doc auto|main|page=MediaWiki:Mobile.css}} → CSS-код ниже относится к мобильной версии Википедии. CSS в мобильной версии загружается асинхронно.
  • {{#invoke:Script doc auto|main|page=MediaWiki:Vector.js}} → JS-код ниже относится к теме оформления «Vector, устаревшая (2010)». CSS-файл для этой темы: MediaWiki:Vector.css.

Личные скрипты

  • {{#invoke:Script doc auto|main|page=Участник:Stjn/common.js}} → JS-код ниже относится ко всем темам оформления (включая мобильную версию) Википедии. CSS-файл: Участник:Stjn/common.css.
  • {{#invoke:Script doc auto|main|page=Участник:Stjn/mobile.css}}
  • {{#invoke:Script doc auto|main|page=Участник:Stjn/monobook.css}} → CSS-код ниже относится к теме оформления «MonoBook». JS-файл для этой темы: Участник:Stjn/monobook.js.
  • {{#invoke:Script doc auto|main|page=Участник:Serhio Magpie/instantDiffs.css}} → У этого CSS-кода есть связанный JS-файл: Участник:Serhio Magpie/instantDiffs.js.
  • {{#invoke:Script doc auto|main|page=Участник:Jack who built the house/alignTemplateParameters.js}} → У этого JS-кода есть документация: Участник:Jack who built the house/alignTemplateParameters.
require( 'strict' )

local Gadgets = require( 'Module:Gadgets' )
local Arguments = require( 'Module:Arguments' )
local TableTools = require( 'Module:TableTools' )

local p = {}

local function parsePageName( page )
	local prefixStart, prefixEnd = mw.ustring.find( tostring( page ), '%.[cj]ss?o?n?$' )
	return prefixStart, prefixEnd, prefixStart ~= nil and mw.ustring.sub( tostring( page ), prefixStart + 1, prefixEnd ) or ''
end

local function isSkinPage( name, includeMobile )
	name = name:lower()
	
	local skinMsg = mw.message.new( 'skinname-' .. name )
	local isMobile = includeMobile and name == 'mobile' or false
	return isMobile or name == 'common' or skinMsg:exists(), skinMsg
end

local function getPageType( pagetype, ending )
	ending = ending and ending .. ' ' or ' ниже '
	return mw.ustring.upper( pagetype ) .. '-код' .. ending
end

local function formatDesc( desc )
	local frame = mw.getCurrentFrame()
	return ': <i>' .. frame:preprocess( desc ) .. '</i>'
	-- return ' <i>«' .. frame:preprocess( desc ):gsub( '«', '„' ):gsub( '»', '“' ) .. '»</i>'
end

p._makeRelatedMessage = function( pageType, sisterPage )
	if sisterPage.exists then
		return string.format(
			' Связанный %s-файл: [[%s]].',
			mw.ustring.upper( pageType ),
			tostring( sisterPage )
		)
	end
	
	return ''
end

p._makeUserMessage = function( pagetype, basePage, sisterPage )
	local text = ''
	
	if basePage.exists then
		text = text .. string.format( 'есть документация: [[%s]].', tostring( basePage ) )
	end
	
	if sisterPage.exists then
		local message = 'Связанный %s-файл: [[%s]].'
		if not basePage.exists then
			message = 'есть ' .. mw.ustring.lower( message )
		end
		local _, _, sisterType = parsePageName( sisterPage )
		text = text .. string.format(
			message,
			mw.ustring.upper( sisterType ),
			tostring( sisterPage )
		)
	end
	
	if text ~= '' then
		text = 'У этого ' .. getPageType( pagetype, 'а' ) .. text
	end
	
	return text
end

p._makeSkinMessage = function( pagetype, skin, name, sisterPage, isUserPage )
	local text = getPageType( pagetype )
	
	local _, _, sisterType = parsePageName( sisterPage )
	local mainPageUrl = mw.uri.fullUrl( mw.message.new( 'mainpage' ):plain(), 'useskin=' .. skin )
	if skin == 'common' then
		text = text .. string.format(
			'относится ко всем темам оформления %s Википедии. %s-файл: [[%s]].',
			isUserPage and '(включая мобильную версию)' or 'стационарной версии',
			mw.ustring.upper( sisterType ),
			tostring( sisterPage )
		)
	elseif skin == 'mobile' and pagetype == 'css' then
		text = text .. string.format(
			'относится к мобильной версии Википедии. CSS в мобильной версии загружается асинхронно.',
			mw.ustring.upper( sisterType ),
			tostring( sisterPage )
		)
	else
		text = text .. string.format(
			'относится к теме оформления [%s «%s»]. %s-файл для этой темы: [[%s]].',
			tostring( mainPageUrl ),
			name:plain(),
			mw.ustring.upper( sisterType ),
			tostring( sisterPage )
		)
	end
	
	return text
end

p._makeGadgetMessage = function( pagetype, name, repo )
	local obj = repo[ name ]
	local options = obj.options
	local text = getPageType( pagetype )
	
	local gadgetLink = 'Special:Gadgets#gadget-' .. name
	local descPage = mw.title.new( 'MediaWiki:Gadget-' .. name )
	local gadgetType = options.hidden ~= nil and 'к скрытому гаджету' or 'к гаджету'
	if descPage.exists then
		local gadgetDesc = formatDesc( descPage:getContent() )
		local descEditUrl = mw.uri.fullUrl( tostring( descPage ), 'action=edit' )
		text = text .. string.format(
			'[[%s|относится %s]]%s<span class="group-engineer-show group-sysop-show"> ([%s править описание])</span>.',
			gadgetLink,
			gadgetType,
			gadgetDesc,
			tostring( descEditUrl )
		)
	else
		text = text .. string.format( 'относится %s [[%s|%s]].', gadgetType, gadgetLink, name )
	end
	
	for _, page in ipairs(obj.pages) do
		local relatedName = 'MediaWiki:Gadget-' .. page
		local _, _, relatedType = parsePageName( relatedName )
		if pagetype ~= relatedType then
			text = text .. p._makeRelatedMessage( relatedType, mw.title.new( relatedName ) )
		end
	end
	
	if options.default ~= nil then
		if options.categories == nil then
			text = text .. ' <b>Он включён по умолчанию.</b>'
		end
	else
		local usageNum = Gadgets.get_usage( name )
		local Round = require( 'Module:Math' )._round
		if usageNum ~= -1 then
			local lang = mw.getContentLanguage()
			text = text .. string.format(
				' Его использует [[Special:GadgetUsage|около %s учётных записей]].',
				lang:formatNum( Round( usageNum / 100, 0 ) * 100 )
			)
		end
	end
	
	if options.categories ~= nil then
		text = text .. ' Он <b>вызывается по умолчанию</b> на страницах в категории '
		
		text = text .. string.format( '[[:Category:%s|%s]]', options.categories, options.categories )
		text = text .. '.'
	end
	
	return text
end

p._makeMessage = function( pagetype, basepage, sisterpage )
	local text = ''
	
	-- User pages
	if basepage.namespace == 2 then
		local skinName = basepage.subpageText:lower()
		local isSkinPage, skinMsg = isSkinPage( skinName )
		if isSkinPage then
			text = p._makeSkinMessage( pagetype, skinName, skinMsg, sisterpage, true )
		else
			text = p._makeUserMessage( pagetype, basepage, sisterpage )
		end
	end
	
	-- MediaWiki namespace
	if basepage.namespace == 8 then
		if basepage.text:find( '^Gadget-' ) ~= nil then
			local gadgetRepo = Gadgets.parse()
			local shortName = basepage.text:gsub( '^Gadget%-', '' ) .. '.' .. pagetype
			for name, config in pairs( gadgetRepo ) do
				if TableTools.inArray( config.pages, shortName ) then
					text = p._makeGadgetMessage( pagetype, name, gadgetRepo )
				end
			end
		end
		
		local skinName = basepage.text:lower()
		local isSkinPage, skinMsg = isSkinPage( skinName, true )
		if isSkinPage then
			text = p._makeSkinMessage( pagetype, skinName, skinMsg, sisterpage )
		end
	end
	
	return text
end

p._main = function( page )
	local len = mw.ustring.len( page )
	if len < 4 then
		-- Too short page name, do nothing
		return ''
	end
	
	local prefixStart, prefixEnd, lang = parsePageName( page )
	if prefixStart ~= nil then
		local basepage = mw.ustring.sub( page, 0, prefixStart - 1 )
		local sisterpage = basepage .. ( lang == 'js' and '.css' or '.js' )
		return p._makeMessage( lang, mw.title.new( basepage ), mw.title.new( sisterpage ) )
	end
	
	return ''
end

p.main = function( frame )
	local args = Arguments.getArgs( frame )
	return p._main( args.page or mw.title.getCurrentTitle().fullText )
end

return p